import { WSSend } from "../Components/Websocket/Websocket";
import store from "../store/store";
import { writeMessage, onlineList } from "../store/actions/chat";
import {
  msgTypes,
  SubscribeToChatMsg,
  SendMessageMsg,
  ReciveMessageMsg,
  NewUserOnChatMsg,
  OnlineListRequest,
  OnlineListResponse,
} from "./api";

function exec(msgJSON) {
  let typeIsCorrect = false;
  JSON.parse(msgJSON, function (key, value) {
    if (key === "APIType" && typeof api[value] != "undefined") {
      api[value](msgJSON);
      typeIsCorrect = true;
    }
    if (!typeIsCorrect) console.log("incorrect APIType value: ", value);
  });
}

const api = {
  //OUT
  [msgTypes.subscribeToChat]: function (chatID) {
    const storage = store.getState();
    const msg = new SubscribeToChatMsg(
      chatID,
      storage.account.account.userName
    );
    WSSend(JSON.stringify(msg));
  },

  //OUT
  [msgTypes.sendMessage]: function (chatID, image, message) {
    const storage = store.getState();
    const msg = new SendMessageMsg(
      chatID,
      storage.account.account.userName,
      image,
      message
    );
    WSSend(JSON.stringify(msg));
  },

  //OUT
  [msgTypes.requestOnlineList]: function (chatID) {
    const msg = new OnlineListRequest(chatID);
    WSSend(JSON.stringify(msg));
  },

  //IN
  [msgTypes.reciveMessage]: function (msgJSON) {
    const msg = new ReciveMessageMsg();
    JSON.parse(msgJSON, function (a, b) {
      if (typeof msg[a] != "undefined") {
        msg[a] = b;
      }
    });
    store.dispatch(
      writeMessage(
        msg.chatID,
        msg.userName,
        msg.timestamp,
        msg.image,
        msg.message
      )
    );
    console.log(msg);
  },

  //IN
  [msgTypes.newUserOnChat]: function (msgJSON) {
    const msg = new NewUserOnChatMsg();
    JSON.parse(msgJSON, function (a, b) {
      if (typeof msg[a] != "undefined") {
        msg[a] = b;
      }
    });
    // console.log(msg);
  },

  //IN
  [msgTypes.responseOnlineList]: function (msgJSON) {
    // const msg = new OnlineListResponse();
    // JSON.parse(msgJSON, function (a, b) {
    //   if (typeof msg[a] != "undefined") {
    //     msg[a] = b;
    //     console.log(typeof msg[a]);
    //   }
    // });
    const msg = JSON.parse(msgJSON);
    // console.log(msgJSON);
    // console.log(msg["onlineList"]);
    store.dispatch(onlineList(msg["chatID"], msg["onlineList"]));
  },
};

export { exec };
export default api;
